TP - Créer et déclencher des alertes
Ce TP vise à mettre en pratique les exemple d'alerte du cours sur nos trois node_exporter
du TP1 et configurer les notifications depuis une instance de alertmanager
- Assurez vous d'avoir bien suivi le TP1 et d'avoir 3 instances de
node_exporter
en train de tourner et unprometheus
local configuré pour les surveiller.
Pour chaque exemple d'alerte sauf les deux dernières (FDsNearLimit et les annotations):
- testez l'expression de l'alerte pour comprendre ce qu'elle renvoie comme données
- ajoutez l'alerte à la configuration des règles de prometheus créés lors du TP sur les recording rules (
prometheus.rules.yml
) - Essayez de déclencher l'alerte
- Essayez ensuite de résoudre l'alerte
Correction:
prometheus.rules.yml
:
groups:
- name: node-rules
rules:
- record: job:up:avg
expr: avg without(instance, group)(up{job="node"})
- alert: UnServeurArrete
expr: up{job="node"} == 0
for: 45s # short delay pour le tp
labels:
severity: ticket
- alert: PlusieursServeursArretes
expr: job:up:avg{job="node"} < 0.5
for: 30s # short delay pour le tp
labels:
severity: page
Configurer Alertmanager avec un webhook
Téléchargez alertmanager sur la page de téléchargement de prometheus et décompressez le.
Dans le fichier
prometheus.yml
ajoutez la section suivante et rechargez la configuration:
alerting:
alertmanagers:
- static_configs:
- targets:
- 127.0.0.1:9093
- Dans le fichier
alertmanager.yml
on peut ajouter la configuration d'exemple suivante:
global:
# The smarthost and SMTP sender used for mail notifications.
# smtp_smarthost: 'localhost:25'
# smtp_from: 'alertmanager@example.org'
# smtp_auth_username: 'alertmanager'
# smtp_auth_password: 'password'
# The directory from which notification templates are read.
# templates:
# - '*.tmpl'
# The root route on which each incoming alert enters.
route:
group_by: ['alertname']
group_wait: 20s
group_interval: 5m
repeat_interval: 3h
receiver: python_webhook_1
routes: # other routes
- matchers:
- severity =~ "(page|error)"
receiver: python_webhook_2
# Here, if an alert with a severity label of page-regionfail is firing,
# it will suppress all your alerts with the same region label that have a severity label of page
inhibit_rules:
- source_matchers:
- severity = page
target_matchers:
- severity = ticket
equal: ['job']
receivers:
- name: 'python_webhook_1'
webhook_configs:
- url: 'http://localhost:5000' # adresse d'une application flask pour visualiser le webhook
- name: 'python_webhook_2'
webhook_configs:
- url: 'http://localhost:5001'
- Créer deux petites applications
webhook1.py
,webhook2.py
python pour recevoir et visualiser les deux webhooks (changez le port 5000 à 5001 pour la deuxième):
import json
from http.server import BaseHTTPRequestHandler
from http.server import HTTPServer
from pprint import pprint
class LogHandler(BaseHTTPRequestHandler):
def do_POST(self):
self.send_response(200)
self.end_headers()
length = int(self.headers['Content-Length'])
data = json.loads(self.rfile.read(length).decode('utf-8'))
# pprint(data) # pour afficher tout le webhook décommentez ici
for alert in data["alerts"]:
print(alert)
if __name__ == '__main__':
httpd = HTTPServer(('', 5000), LogHandler)
httpd.serve_forever()
Lancez les avec par exemple
python3 webhook1.py
Si vous déclenchez les alertes du cours avec les labels severity: page ou ticket vous devriez recevoir des notifications sur les webhook python
Expérimentez avec les labels sur les alertes et les routes pour essayer d'activer l'inhibition décrite dans la section correspondante du
alertmanager.yml